
#include <stdio.h>
#include "wm_hal.h"
#include "CloudLog.h"
#define TAG			"MyTag"

int CloudLogGetTime(CLOG_TIME* logtim){						// 获取本地时间及系统运行tick 必须在用户的主程序之中实现函数功能
	return HAL_GetTick();
}
void Error_Handler(void);
static void GPIO_Init(void);

static volatile uint8_t key_flag = 0;

int main(void){
	SystemClock_Config(CPU_CLK_160M);
	printf("enter main\r\n");
	// 因为不符合日志的规则，显示为Lost [15:19:06][L][COM5][enter main]
	HAL_Init();
	GPIO_Init();
	
	CLOGE(TAG, "这是一条Error日志");						
	// 简易风格  输出："E 0000 MyTag 这是一条Error日志" 
	// 键值对风格输出："ll:E&lt:6L+Z5piv5LiA5p2hRXJyb3Lml6Xlv5c=&dt:AAA=&an:MyApp&ta:MyTag&tc:ut"
	// CloudLog  显示："[15:19:06][E][MyTag][这是一条Error日志]【计时开始】"

	CLOGW(TAG, "这是一条Warn日志");							
	// 简易风格  输出："W 0001 MyTag 这是一条Warn日志" 
	// 键值对风格输出："ll:W&lt:6L+Z5piv5LiA5p2hV2FybuaXpeW/lw==&dt:BAA=&an:MyApp&ta:MyTag&tc:ut"
	// CloudLog  显示："[15:19:06][W][MyTag][这是一条Warn日志]【用时4ms】"

	CLOGI(TAG, "这是一条Info日志");							
	// 简易风格  输出："I 0004 MyTag 这是一条Info日志" 
	// 键值对风格输出："ll:I&lt:6L+Z5piv5LiA5p2hSW5mb+aXpeW/lw==&dt:CwA=&an:MyApp&ta:MyTag&tc:ut"
	// CloudLog  显示："[15:19:06][I][MyTag][这是一条Info日志]【用时7ms】"

	CLOGD(TAG, "这是一条Debug日志");						
	// 简易风格  输出："D 0008 MyTag 这是一条Debug日志" 
	// 键值对风格输出："ll:D&lt:6L+Z5piv5LiA5p2hRGVidWfml6Xlv5c=&dt:EQA=&an:MyApp&ta:MyTag&tc:ut"
	// CloudLog  显示："[15:19:06][D][MyTag][这是一条Debug日志]【用时6ms】"
	
	// Buffer日志可以将数组阵列显示到CloudLog.exe及保存到文件，在电脑直接跟踪数组阵列的内容	
	uint8_t array[16];
	for (int index = 0; index < sizeof(array); index++) {
		array[index] = (uint8_t)index;
	}
	CLOGB(TAG, array, sizeof(array), "这是一条Buffer日志");		// "B 0010 806 这是一条Buffer日志 16[000102030405060708090a0b0c0d0e0f]"
	// 简易风格  输出："B 0011 MyTag 这是一条Buffer日志 16[000102030405060708090a0b0c0d0e0f]" 
	// 键值对风格输出："ll:B&lt:6L+Z5piv5LiA5p2hQnVmZmVy5pel5b+X&lb:AAECAwQFBgcICQoLDA0ODw==&dt:GAA=&an:MyApp&ta:MyTag&tc:ut"
	// CloudLog  显示："[15:19:06][B][MyTag][这是一条Buffer日志]【用时7ms】"
	// 				   "0001020304050607 08090a0b0c0d0e0f" 	
	while (1){
		
		// Fixer日志主要用于跟踪动态变化的数据，固定位置显示
		uint32_t tick = HAL_GetTick();
		uint32_t minute = tick / (60 * 1000); 
		tick = tick % (60 * 1000); 
		CLOGF(TAG, "Fixer日志 %02d:%02d.%03d (%d)",minute, tick/1000, tick%1000, HAL_GetTick());
		// 简易风格  输出："F 0018 MyTag Fixer日志 00:00.018 (18)" 
		// 键值对风格输出："ll:F&lt:Rml4ZXLml6Xlv5cgMDA6MDAuMDMzICgzMyk=&dt:IQA=&an:MyApp&ta:MyTag&tc:ut"
		// CloudLog  显示："Fixer日志 00:04.052 (4052)"
									
		HAL_Delay(1000);									// "F 0017 806 Fixer日志 00:00.017 (17)"
		key_flag++;
		
		if(key_flag%3==0)
		{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,0);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,1);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,1);
		}
		else if(key_flag%3==1)
		{
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,1);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,1);
		}
		else
		{

			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,1);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,1);
			HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2,0);
		}

		
	}
	
    return 0;
}

static void GPIO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	__HAL_RCC_GPIO_CLK_ENABLE();

	GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2, GPIO_PIN_SET);
	
	GPIO_InitStruct.Pin = GPIO_PIN_5;
	GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	HAL_NVIC_SetPriority(GPIOB_IRQn, 0);
	HAL_NVIC_EnableIRQ(GPIOB_IRQn);

}

void HAL_GPIO_EXTI_Callback(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)
{
	if ((GPIOx == GPIOB) && (GPIO_Pin == GPIO_PIN_5))
	{
		key_flag = 1;
	}
}

void Error_Handler(void)
{
	while (1)
	{
	}
}

void assert_failed(uint8_t *file, uint32_t line)
{
	printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}